#pragma once
#include <iostream>
#include <string>

std::string opers = "+-*/%";

enum
{
    Divzero = 1,
    Modzero,
    Unknow
};

class Task
{
public:
    Task()
    {
    }
    Task(int data1, int data2, char oper)
        : _data1(data1), _data2(data2), _oper(oper), _exitcode(0),_result(0)
    {
    }
    void run()
    {
        switch (_oper)
        {
        case '+':
            _result = _data1 + _data2;
            break;
        case '-':
            _result = _data1 - _data2;
            break;
        case '*':
            _result = _data1 * _data2;
            break;
        case '/':
        {
            if (_data2 == 0)
                _exitcode = Divzero;
            else
                _result = _data1 / _data2;
        }
        break;
        case '%':
        {
            if (_data2 == 0) _exitcode = Modzero;
            else _result = _data1 % _data2;
        }
        break;
        default:
            _exitcode = Unknow;
            break;
        }
    }

    void operator ()()
    {
        run();
    }

    std::string Getresult()
    {
        std::string ret = std::to_string(_data1);
        ret += _oper;
        ret += std::to_string(_data2);
        ret += "=";
        ret += std::to_string(_result);
        ret += "[exitcode=";
        ret += std::to_string(_exitcode);
        ret += "]";
        return ret;
    }

    std::string GetTask()
    {
        std::string ret = std::to_string(_data1);
        ret += _oper;
        ret += std::to_string(_data2);
        ret += "=?";
        return ret;
    }

    ~Task()
    {
    }

private:
    int _data1;
    int _data2;
    char _oper;

    int _exitcode;
    int _result;
};

// #pragma once
// #include <iostream>
// #include <string>

// std::string opers="+-*/%";

// enum{
//     DivZero=1,
//     ModZero,
//     Unknown
// };

// class Task
// {
// public:
//     Task()
//     {}
//     Task(int x, int y, char op) : data1_(x), data2_(y), oper_(op), result_(0), exitcode_(0)
//     {
//     }
//     void run()
//     {
//         switch (oper_)
//         {
//         case '+':
//             result_ = data1_ + data2_;
//             break;
//         case '-':
//             result_ = data1_ - data2_;
//             break;
//         case '*':
//             result_ = data1_ * data2_;
//             break;
//         case '/':
//             {
//                 if(data2_ == 0) exitcode_ = DivZero;
//                 else result_ = data1_ / data2_;
//             }
//             break;
//         case '%':
//             {
//                 if(data2_ == 0) exitcode_ = ModZero;
//                 else result_ = data1_ % data2_;
//             }            
//             break;
//         default:
//             exitcode_ = Unknown;
//             break;
//         }
//     }
//     void operator ()()
//     {
//         run();
//     }
//     std::string Getresult()
//     {
//         std::string r = std::to_string(data1_);
//         r += oper_;
//         r += std::to_string(data2_);
//         r += "=";
//         r += std::to_string(result_);
//         r += "[code: ";
//         r += std::to_string(exitcode_);
//         r += "]";

//         return r;
//     }
//     std::string GetTask()
//     {
//         std::string r = std::to_string(data1_);
//         r += oper_;
//         r += std::to_string(data2_);
//         r += "=?";
//         return r;
//     }
//     ~Task()
//     {
//     }

// private:
//     int data1_;
//     int data2_;
//     char oper_;

//     int result_;
//     int exitcode_;
// };